#include "QQZipApi.h"

QQZipApi::QQZipApi(QObject* parent)
{
}

QQZipApi::~QQZipApi()
{
}

bool QQZipApi::compress_file(const QString& src_file, const QString& target_file)
{
	zip_t* zip_file = zip_open(target_file.toStdString().c_str(), ZIP_CREATE, nullptr);
	zip_source_t* source = zip_source_file(zip_file, src_file.toStdString().c_str(), 0, 0);
	zip_int64_t index = zip_file_add(zip_file, QFileInfo(src_file).fileName().toStdString().c_str(), source, ZIP_FL_OVERWRITE);
	zip_close(zip_file);
	return true;
}

bool QQZipApi::compress_dir(const QString& src_dir, const QString& target_file)
{
	QDir dir(src_dir);
	QFileInfoList files = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot);
	zip_t* zip_file = zip_open(target_file.toStdString().c_str(), ZIP_CREATE, nullptr);
	foreach(const QFileInfo & file_info, files) {
		zip_source_t* source = zip_source_file(zip_file, file_info.absoluteFilePath().toStdString().c_str(), 0, 0);
		zip_int64_t index = zip_file_add(zip_file, file_info.fileName().toStdString().c_str(), source, ZIP_FL_OVERWRITE);
	}
	zip_close(zip_file);
	return true;
}

bool QQZipApi::decompress_file(const QString& src_file, const QString& target_file)
{
	zip_t* zip_file = zip_open(src_file.toStdString().c_str(), ZIP_RDONLY, nullptr);
	zip_int64_t num_entries = zip_get_num_entries(zip_file, 0);
	zip_file_t* file = zip_fopen_index(zip_file, 0, 0);
	QFile target(target_file);
	target.open(QIODevice::WriteOnly);
	char buf[ZIP_FILE_CACHE_SIZE];
	while (zip_fread(file, buf, ZIP_FILE_CACHE_SIZE) > 0) {
		target.write(buf, ZIP_FILE_CACHE_SIZE);
	}
	target.close();
	zip_fclose(file);
	zip_close(zip_file);
	return true;
}

bool QQZipApi::decompress_dir(const QString& src_file, const QString& target_dir)
{
	zip_t* zip_file = zip_open(src_file.toStdString().c_str(), ZIP_RDONLY, nullptr);
	zip_int64_t num_entries = zip_get_num_entries(zip_file, 0);
	for (int i = 0; i < num_entries; i++) {
		zip_file_t* file = zip_fopen_index(zip_file, i, 0);
		QFile target(target_dir + "/" + zip_get_name(zip_file, i, 0));
		target.open(QIODevice::WriteOnly);
		char buf[ZIP_FILE_CACHE_SIZE];
		while (zip_fread(file, buf, ZIP_FILE_CACHE_SIZE) > 0) {
			target.write(buf, ZIP_FILE_CACHE_SIZE);
		}
		target.close();
		zip_fclose(file);
	}
	return true;
}